前陣子在一次技術分享裡,我講的題目是「一切都是 Tool Use:WebAssembly 作為 Agentic Workflow 的執行層」。
十年前為了跑遊戲,十年後是 Agentic Workflow 的新寵兒,說的就是……WebAssembly 啦~從瀏覽器裡的加速引擎,到 WasmEdge 推進 Serverless 與邊緣運算,再到今天成為 Agent 執行層中微秒級的信任邊界。
光是這一段就橫跨了十年、三個宿主、三種完全不同的威脅模型,可想而知,背後有很多故事值得重新說清楚:它為什麼長這樣、每一次換宿主是被什麼逼的、到了 agent 手上又為什麼剛好合用。那場短短不到四十分鐘的分享,實際上是不夠的,很多地方只能稍微帶過,聚焦在 Agentic Workflow 的應用上。而現在就有鐵人賽三十天這個機會,那就好好把整個故事說清楚吧。
再者,我們現在活在一個 LLM 非常強大的時代,每天都被一大堆資料、文字、回覆轟炸。務實面來說,當下面對的問題大多都能解決;但換句話來說,也太快了:問完、解完、關掉分頁,船過水無痕。所以在這個時代,我反而覺得更應該花稍微多一點的時間,把自己心中的想法沉澱下來——不是為了產出更多,而是為了確認自己真的懂了什麼。
先從一個剛好閉起來的環講起。
WebAssembly 出生在瀏覽器裡,那也早已是 2015 年的事。而瀏覽器,從第一天開始就在做一件現在想起來很誇張的事:你隨手點開一個網址,一段你沒看過、不知道誰寫的、也沒人審查過的程式碼,就在你的機器上跑起來了。瀏覽器恰巧就是「執行陌生人的程式碼」這件事做得最久、也被打得最慘的地方,所以它演化出來的每一樣東西,包括 WebAssembly,骨子裡都是同一句話:來路不明的東西,先隔離起來,再談跑得快不快。這段歷史怎麼走的,之後慢慢說;今天先記住這個出身就好。
十年後,也就是現在,把這條線拉過來。所謂的 agentic workflow,拆開來看其實就是 tool use 的各種排列組合:模型吐出一段文字,你的程式把控制權交出去一次;讀個檔、查個資料庫、打個 API、再開一個模型迴圈,不管它叫 tool call、RAG、harness、sub-agent 還是 MCP,本質都是這一下。模型輸出的只有 token;檔案被寫、錢被轉、機台被下指令,都不在模型裡發生,都在你的程式裡。
問題就出在這裡,而且是兩個維度的問題。
第一個維度:tool 本身是陌生的。你接進來的工具,可能是別人寫的、從某個 registry 拉下來的、昨天才更新過的;它能碰哪些檔案、能連哪些網址、拿的是誰的權限,你多半沒有審查過。這不就是十年前瀏覽器面對的那件事嗎?來路不明的程式碼,跑在你的行程裡。
第二個維度更誇張:排列組合也是陌生的。就算每一個 tool 都正常、良好、健康,誰寫的都查過了,一個會讀網頁的 tool 加一個會寫檔案的 tool,中間夾一個會照著文字做事的模型,三個合在一起就是一條沒有人設計過的路徑。單獨看每一塊都沒問題,組起來會出狀況;而這個組合是模型在執行期臨場決定的,你事前根本列不完。
所以,今天的 agent 預設長什麼樣?多數時候是「沒有邊界」:tool 就是一段跑在主程式裡的 code,或是一個 subprocess,權限跟你的 shell 一樣大,吃的卻是不是你寫的輸入。這時候一個十年前就在的東西走了過來:
WebAssembly:我並不是來解救你的,我只是剛好路過了十年。(誤
它出生就是為了關住陌生人的程式碼,十年後回來關住陌生人的 tool,環就在這裡閉起來。從瀏覽器走到雲端再走到 agent,它每一個時代解決的都是自己的問題,沒有一幕是為 AI 設計的;但每一幕都在加同一件事:更嚴格的邊界。而到了這一幕,多了一個關鍵的變化:把一個 tool 從檔案變成可以執行的實例,這個動作的成本被壓到了微秒級。
這剛好對上前面那兩個維度。對陌生的 tool:它預設什麼都不能做,能碰哪個資料夾、能連哪個網址,是宿主在這一次呼叫時明白給的,沒給就沒有;你要審查的對象從「這段程式碼會做什麼」變成「我給了它什麼」,後者是你自己寫的,看得完。對陌生的排列組合:既然建實例便宜,就可以一次呼叫一個實例、用完就丟,上一次呼叫留下的東西滲不進下一次;組合再怎麼臨場,每一步最多也只拿得到你那一步給它的東西,出事的範圍有上限。它不會讓模型變聰明,也不會替你決定該給多少;它做的是把「那條線」變成每一次呼叫都守得住、也守得起的東西。這就是整個系列的結論,先放在這裡,接下來二十九天都是在證明它:
模型只負責吐字,執行的一律是你的程式;所以真正要守的那條線,在 tool 那一刻。WebAssembly 從來不是為 AI 設計的,但它花了十年,剛好把那條線磨成微秒級。
三十天就照它走過的三個時代走:瀏覽器、雲原生、agent。最後一段最長,前兩段把基本功打完。
一句帶走:agentic workflow 是 tool use 的排列組合,模型吐字、你的程式執行;陌生的 tool、陌生的組合,真正要守的那條線,在 tool 那一刻。